JWT কি এবং কেন এটি ব্যবহার করা হয়?

Spring Security এবং JWT (JSON Web Token) - স্প্রিং সিকিউরিটি (Spring Security) - Java Technologies

394

JWT (JSON Web Token):

JSON Web Token (JWT) একটি কমপ্যাক্ট এবং সুরক্ষিত টোকেন ফরম্যাট যা JSON-ভিত্তিক ডেটা এনকোড করে একটি সাইনড স্ট্রিং আকারে আদান-প্রদান করা হয়। এটি সাধারণত অ্যাপ্লিকেশনগুলোর Authentication এবং Authorization এর জন্য ব্যবহৃত হয়।


JWT কেন ব্যবহৃত হয়?

JWT প্রধানত নিম্নলিখিত কারণগুলোতে ব্যবহৃত হয়:

  1. Stateless Authentication:
    • JWT ব্যবহার করে সার্ভারকে ক্লায়েন্টের সেশন সংরক্ষণ করতে হয় না।
    • টোকেনটি নিজেই সমস্ত তথ্য বহন করে যা সেশন পরিচালনার জন্য প্রয়োজন।
  2. Self-Contained Token:
    • JWT একটি Self-Contained Token যা ব্যবহারকারী সম্পর্কিত সমস্ত তথ্য এনকোড করা থাকে।
  3. Cross-Domain Communication:
    • এটি ওয়েব ব্রাউজার এবং API-এর মধ্যে সহজে কাজ করে।
    • Cross-Origin Resource Sharing (CORS) সমস্যার সমাধানে সাহায্য করে।
  4. Compact and Efficient:
    • JSON ভিত্তিক ডেটা সংরক্ষণ করে যা Human-Readable এবং Lightweight।
    • HTTP Header, Query Parameter, বা Cookie এর মাধ্যমে সহজেই পাঠানো যায়।
  5. Security:
    • টোকেনটি ডিজিটালি সাইনড থাকে (HMAC বা RSA), যা নিশ্চিত করে যে এটি পরিবর্তিত হয়নি।
    • JWT এনক্রিপশন ব্যবহার করলে ডেটা এনক্রিপ্টেড ফরম্যাটে থাকে।

JWT এর স্ট্রাকচার:

JWT তিনটি অংশে বিভক্ত থাকে এবং প্রতিটি অংশ ডট (.) দিয়ে পৃথক করা হয়:

HEADER.PAYLOAD.SIGNATURE
  1. Header:
    • Header-এ টোকেনের প্রকার এবং সাইনিং অ্যালগরিদমের তথ্য থাকে।
    • উদাহরণ:

      {
        "alg": "HS256",
        "typ": "JWT"
      }
      
  2. Payload:
    • Payload-এ টোকেনের মূল তথ্য (Claims) থাকে।
    • উদাহরণ:

      {
        "sub": "1234567890",
        "name": "John Doe",
        "role": "ADMIN",
        "exp": 1688000000
      }
      
  3. Signature:
    • Signature টোকেনের স্বাক্ষর যা হেডার, পে-লোড এবং সিক্রেট কী ব্যবহার করে জেনারেট করা হয়।
    • উদাহরণ:

      HMACSHA256(
        base64UrlEncode(header) + "." + base64UrlEncode(payload),
        secretKey
      )
      

JWT এর কাজ করার ধাপ:

  1. User Authentication:
    • ব্যবহারকারী লগইন করলে সার্ভার তার পরিচয় যাচাই করে।
    • যাচাই সফল হলে, সার্ভার একটি JWT জেনারেট করে এবং ক্লায়েন্টকে প্রদান করে।
  2. Client Stores Token:
    • ক্লায়েন্ট এই JWT টোকেনটি স্থানীয় স্টোরেজ বা কুকিতে সংরক্ষণ করে।
  3. Token Usage:
    • ক্লায়েন্ট পরবর্তী API রিকোয়েস্টের সাথে Authorization হেডারে JWT পাঠায়:

      Authorization: Bearer <JWT_TOKEN>
      
  4. Server Validates Token:
    • সার্ভার প্রাপ্ত টোকেনটি যাচাই করে।
    • যদি টোকেন বৈধ হয়, তাহলে ক্লায়েন্টকে রিসোর্স অ্যাক্সেস করতে দেয়।

JWT এর সুবিধা:

  1. Stateless:
    • সার্ভার সেশনের জন্য কোনো স্টোরেজ বা ডাটাবেসের প্রয়োজন নেই।
  2. Performance:
    • সার্ভারের লোড কমিয়ে দ্রুত অ্যাক্সেস নিশ্চিত করে।
  3. Scalability:
    • ক্লাস্টার বা ডিস্ট্রিবিউটেড সিস্টেমে কাজ করতে সহজ।
  4. Cross-Platform Compatibility:
    • ভিন্ন ভিন্ন টেকনোলজির মধ্যে কাজ করার জন্য উপযুক্ত।

JWT এর সীমাবদ্ধতা:

  1. Token Revocation:
    • JWT স্টেটলেস হওয়ায় এটি অবৈধ (revoke) করা কঠিন।
  2. Token Size:
    • JWT সেশন কুকির চেয়ে বড় হতে পারে, যা কিছু ক্ষেত্রে বেশি ব্যান্ডউইথ ব্যবহার করতে পারে।
  3. Expiration Management:
    • টোকেন মেয়াদ শেষ হওয়ার পরে নতুন টোকেন জেনারেট করতে ক্লায়েন্টের অতিরিক্ত কাজ করতে হয়।

Spring Security-তে JWT এর ব্যবহার:

Step 1: ডিপেনডেন্সি যোগ করুন

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

Step 2: JWT Token Generator তৈরি করুন

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

public class JwtUtil {

    private static final String SECRET_KEY = "secretKey";

    public static String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60)) // 1 hour validity
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public static boolean validateToken(String token, String username) {
        String extractedUsername = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
        return extractedUsername.equals(username) && !isTokenExpired(token);
    }

    private static boolean isTokenExpired(String token) {
        Date expiration = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getExpiration();
        return expiration.before(new Date());
    }
}

Step 3: JWT Filter তৈরি করুন

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class JwtFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        String authorizationHeader = request.getHeader("Authorization");

        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            String token = authorizationHeader.substring(7);
            String username = JwtUtil.extractUsername(token);

            if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
                if (JwtUtil.validateToken(token, username)) {
                    Authentication auth = JwtUtil.getAuthentication(token);
                    SecurityContextHolder.getContext().setAuthentication(auth);
                }
            }
        }

        filterChain.doFilter(request, response);
    }
}

Step 4: Spring Security Config এ JWT যুক্ত করুন

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/auth/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .addFilter(new JwtFilter());
    }
}

JWT এর জন্য সেরা চর্চা (Best Practices):

  1. Short Token Expiry:
    • টোকেনের মেয়াদ সংক্ষিপ্ত রাখুন এবং রিফ্রেশ টোকেন ব্যবহার করুন।
  2. Secure Secret Key:
    • একটি শক্তিশালী এবং নিরাপদ সিক্রেট কী ব্যবহার করুন।
  3. HTTPS ব্যবহার:
    • সমস্ত টোকেন এনক্রিপ্টেড ট্র্যাফিকে (HTTPS) পাঠান।
  4. Revocation Mechanism:
    • ব্ল্যাকলিস্ট বা কনকারেন্ট সেশন কন্ট্রোল ইমপ্লিমেন্ট করুন।

উপসংহার:

JWT একটি লাইটওয়েট এবং কার্যকর সল্যুশন যা অ্যাপ্লিকেশনগুলিতে Stateless Authentication নিশ্চিত করে। এটি বিশেষত মাইক্রোসার্ভিস এবং মোবাইল অ্যাপ্লিকেশনের মতো ডিস্ট্রিবিউটেড সিস্টেমের জন্য উপযুক্ত। Spring Security-তে JWT সহজেই ইমপ্লিমেন্ট করা যায়, যা Authentication এবং Authorization এর জন্য একটি আধুনিক এবং নিরাপদ সমাধান প্রদান করে।

Content added By
Promotion

Are you sure to start over?

Loading...